﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ThreadV2
{
    class Program
    {
        /*
         *  Task 类的表示的单个操作不会返回一个值，通常以异步方式执行。 
         *  Task 对象是一种的中心思想 首次引入.NET Framework 4 中。
         *  因为由执行工作 Task 对象通常上异步执行一个线程池线程而不是以同步方式在主应用程序线程中，您可以使用 Status 属性，以及 IsCanceled, ，IsCompleted, ，和 IsFaulted 属性，以此来确定任务的状态。
         *  大多数情况下，lambda 表达式用于指定的任务是执行的工作。
         *  线程的创建是比较占用资源的一件事情，.NET 为我们提供了线程池来帮助我们创建和管理线程。Task是默认会直接使用线程池，但是Thread不会。如果我们不使用Task，又想用线程池的话，可以使用ThreadPool类。 
         * 
         */
        static void Main(string[] args)
        {
            Task task = new Task(() => { DoJob(); });
            task.Start();
            //task.Wait();//加wait后，会等待该任务结束才会继续执行后面的任务

            Task task1 = Task.Run(() => { DoJob(); });
            //task1.Wait();//加wait后，会等待该任务结束才会继续执行后面的任务
            
            Task task2 = Task.Factory.StartNew(() => { DoJob(); });
            //task2.Wait();//加wait后，会等待该任务结束才会继续执行后面的任务

            //出于性能原因， Task.Run 或 TaskFactory.StartNew 方法是创建和计划计算的任务的首选的机制

            Console.ReadLine();
        }

        private static void DoJob()
        {
            Console.WriteLine("开始处理...");
            for (var i = 0; i < 10; i++)
            {
                System.Threading.Thread.Sleep(1000);
                Console.WriteLine("线程：{0}，第{1}次运算", System.Threading.Thread.CurrentThread.ManagedThreadId, i + 1);
            }
            Console.WriteLine("处理结束...");
        }
    }
}
